package view;

import java.awt.Color;
import java.awt.Point;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.io.IOException;
import java.util.Vector;
import javax.swing.JPanel;
import model.BaseExpansion;
import model.GameLoader;
import model.ModelBoardCK;
import model.ModelGridCK;
import model.ModelPawnCK;
import model.ModelPositionCK;
import model.ModelTileCK;
import various.Constants;
import various.Formula;
import various.Functions;
import controller.ControllerSquare;

/**
 * Cette vue represente le plateau de jeux. Nous avons representer ce plateau sous forme d'un JPanel en dessinant les grilles avec des drawLine.
 * Il faut ici faire attention a replacer les tuiles qui ont �t� ajout� car lors du repaint elle vont disparaitre. Il faut aussi replacer les pions
 * qui ont �t� plac� sur les tuiles.
 * @author kn - cm
 *
 */
public class ViewSquare extends JPanel {

	/**
	 * 
	 */

	ControllerSquare cs = new ControllerSquare();
	private static final long serialVersionUID = 1L;
	public static int lastTileIndex = -1;
	public int taille;
	public Graphics g;
	public boolean first=true;
	public boolean firstTile = false;
	public GameLoader gl;

	public ViewSquare(int taille) {
		this.setLayout(null);
		this.gl = new GameLoader(new ModelBoardCK(taille), new BaseExpansion());
		g = this.getGraphics();
		super.addMouseListener(cs);
		this.taille=taille;
		super.setPreferredSize(new Dimension(Constants.sizeSquare*Constants.vectorSide,Constants.sizeSquare*Constants.vectorSide));
	}

	public void setViewBoard(ViewBoard vb){
		this.cs.setViewBoard(vb);
	}

	protected void paintComponent(Graphics g){
		super.paintComponent(g);
		if (first) {
			g.drawImage(Toolkit.getDefaultToolkit().getImage("Images/Title/main.png"), ((((Constants.vectorSide)/2)*100)-100), (((Constants.vectorSide)/2)*100), 395, 96, null);
		} 
		else {
			//on dessine le quadrillage
			g.drawImage(Toolkit.getDefaultToolkit().getImage(Constants.linkfirstTile), (((Constants.vectorSide)/2)*100), (((Constants.vectorSide)/2)*100), Constants.sizeSquare, Constants.sizeSquare, null);
			for(int i=0; i<Constants.sizeSquare*Constants.vectorSide; i=i+Constants.sizeSquare)
				g.drawLine(0, i, Constants.sizeSquare*Constants.vectorSide, i);
			for(int i=0; i<Constants.sizeSquare*Constants.vectorSide; i=i+Constants.sizeSquare)
				g.drawLine(i, 0, i, Constants.sizeSquare*Constants.vectorSide);

			// On replace a chaque repaint les tuiles d�ja plac�es
			if (firstTile){
				Image currentImage = null;
				String lnk;
				int angO, angN;
				ModelGridCK grid = this.gl.getBoard().getGrid(); 
				Vector<Point> vpt;
				Image currentPawn =null;
				for(int i=0; i<grid.size();i++)
				{
					int x = Formula.getX(i, Constants.vectorSide)*Constants.sizeSquare;
					int y = Formula.getY(i, Constants.vectorSide)*Constants.sizeSquare;
					//si la case n'est pas vide
					if(((ModelTileCK) grid.get(i))!=null)
					{
						angO = ((ModelTileCK) grid.get(i)).getOldAngle();
						angN = ((ModelTileCK) grid.get(i)).getNewAngle();
						
						
						if(angO != angN)
						{
							//on ne redessine que si il y a eu une rotation n�cessaire
							if((angN -360) != angO)
							{	try {
//									currentImage = Functions.angleRepaint((Image) ((ModelTileCK) grid.get(i)).getPicture(), angN);
//									// on n'oublie pas de maj oldangle
//									((ModelTileCK) grid.get(i)).setOldAngle(angN);
								((ModelTileCK) grid.get(i)).angleRepaint();
								currentImage = ((ModelTileCK) grid.get(i)).getPicture();
								} catch (IOException e) {
									e.printStackTrace();
								}
							}
						}
						else
							currentImage =  (Image) ((ModelTileCK) grid.get(i)).getPicture();
						
						//on dessine les positions pour les pions de la derniere tuile posee
						if(lastTileIndex != -1 && lastTileIndex == i)
						{
							//si il n'y a pas de pion sur la tuile
							if((((ModelTileCK) grid.get(i)).getPawnIndex() == -1))
							{
								System.out.println("on dessine les pions pour la position "+i);
								if(((ModelTileCK) grid.get(i)).getFreePositions()!=null)
								{
									vpt = ((ModelTileCK) grid.get(i)).getFreePositions();
									for(int j=0; j<vpt.size();j++)
									{
										int xx = (int) vpt.get(j).getX();
										int yy = (int) vpt.get(j).getY();
										currentImage.getGraphics().fillOval(xx, yy, 10,10); 
										
									}
								}
							}
						}
						else
							currentImage.getGraphics().dispose();
						//on dessine la tuile
						g.drawImage(currentImage,
								x, y, Constants.sizeSquare, Constants.sizeSquare,
								null);
						if(((ModelTileCK) grid.get(i)).getPawnIndex()!=-1)
						{
							int index = ((ModelTileCK) grid.get(i)).getPawnIndex();

						
							int xp, yp;
							ModelPositionCK mpck = (ModelPositionCK) ((ModelTileCK) grid.get(i)).getPosition().get(index);

							ModelPawnCK mptmp = (ModelPawnCK) mpck.getPawn();
							currentPawn = mptmp.getPic();
							
							
							xp = (int) mpck.getPoint().getX();
							yp = (int) mpck.getPoint().getY();
							g.drawImage(currentPawn, x+xp, y+yp, 20,20, null);
						}
					}
				}
			}
		}
		this.repaint();
	}
}